local redis = require 'redis';
local host = "127.0.0.1"
local port = 6379

client = redis.connect(host, port)

redis.call = function(cmd, ...)
    --return assert(loadstring('return client:'.. string.lower(cmd) ..'(...)'))(...)
    return assert(load('return client:'.. string.lower(cmd) ..'(...)'))(...)
end

--local KEYS = {'rewardSetKey' ,'userIdsKey' ,'actorIdHashKey'};
local KEYS = {'liveshow:RobBoxKey:10746:3' ,'liveshow:hadOwnBoxUserIdKey:10746:3' ,'liveshow:achievedGradeRewardKey:3'};

local ARGV = {10598 ,10746, 1563169214463};






--[[
    抢宝箱，
    从对应的宝箱集合中抢一个给当前用户，如果用户已经抢过，则不再给用户分配

    key[1]: 房间的宝箱
    key[2]: 已经抢到人的id集合
    key[3]: 已经达到了满足指定等级的主播, key: 主播id，  value:抢购开启时间(ms)
    ARGV[1]: 用户id
    ARGV[2]: 房间id
    ARGV[3]: 当前时间

    返回数组参数
        ret : 宝箱的id

]]

local rewardSetKey = KEYS[1];
local userIdsKey = KEYS[2];
local actorIdHashKey = KEYS[3];
local userId = ARGV[1];
local roomId = ARGV[2];
local currentTime = ARGV[3];


-- 查看当前主播是否已经达到了抢宝箱的等级，没有直接返回nil
local startTime = redis.call('HGET', actorIdHashKey, roomId) ;
if startTime == nil then
    return nil;
end

-- 如果还没开启，返回nil
if tonumber(startTime) > tonumber(currentTime) then
    return nil;
end

-- 查看是否已经抢购过该类型的宝箱，如果存在值，直接返回nil
local hasRobed = redis.call('SISMEMBER', userIdsKey, userId) ;
if hasRobed then
    return nil;
end
-- 从list中弹出一个，同时在已抢到的用于中插入用户id
local rewardId = redis.call('SPOP', rewardSetKey);
if rewardId ~= nil then
    redis.call('SADD', userIdsKey, userId) ;
end
-- 返回宝箱id
return rewardId;
